﻿Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports SF = StartFrame.SystemFunctions

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://localhost/SiuReAut/Servicios/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class Service1
    Inherits System.Web.Services.WebService

#Region "Declaraciones"

    Private _ServerUsr As String

#End Region

#Region "Web Methods"

#Region "Testing"

    'Respuesta simple del servicio
    <WebMethod(Description:="Respuesta simple del servicio")> _
    Public Function zTest1_Respuesta() As String
        Return "Prueba simple de respuesta del servicio: ok"
    End Function

    'Logueo a Fwrk y conexión con BD
    <WebMethod(Description:="Logueo a Fwrk y conexión con BD")> _
    Public Function zTest2_Logueo(ByVal usuario As String, ByVal clave As String) As String
        If Login(usuario, clave) Then
            Return "Logueo ok con el operador " & _ServerUsr
        Else
            Return "Logueo incorrecto"
        End If
    End Function

    'Ejecución de consulta a SQL sin autenticar usuario
    <WebMethod(Description:="Ejecución de consulta a SQL sin autenticar usuario")> _
    Public Function zTest3_SelectSinLogueo() As DataSet
        If Login() Then
            Dim ds As DataSet
            ds = Sql.Select(ConnectionString, "*", "wap_parametros")
            Return ds
        Else
            Throw New Exception("Logueo inválido")
        End If
    End Function

    'Ejecución de consulta a SQL con logueo
    <WebMethod(Description:="Ejecución de consulta a SQL con logueo")> _
    Public Function zTest4_SelectAutenticado(ByVal usuario As String, ByVal clave As String, tabla As String) As DataSet
        If Login(usuario, clave) Then
            Dim ds As DataSet
            ds = Sql.Select(ConnectionString, "*", tabla)
            Return ds
        Else
            Throw New Exception("Logueo inválido")
        End If
    End Function

#End Region

#End Region

#Region "Métodos Privados"

    'Login genérico (sin usuario)
    Private Overloads Function Login() As Boolean
        'Operador genérico del sistema
        _ServerUsr = Common.Env.GetConfigValue("ServerUsr")

        'Clave de acceso
        Dim sca As New StartFrame.BR.Sca
        Dim claveAccesoBD As String = ""
        If sca.ExisteOperador(_ServerUsr) Then
            'Obtiene el password y lo desencripta
            claveAccesoBD = CType(DA.Sql.Search(ConnectionString, "va_clave_acceso", "wad_operadores", "cd_operador = '" & _ServerUsr & "'"), String)
            If claveAccesoBD <> "" Then
                claveAccesoBD = SF.Strings.EncryptString(claveAccesoBD, KEY, SF.Strings.Accion.DECRYPT)
            End If
        End If

        'Logueo al Fwrk
        Dim bRdo As Boolean
        bRdo = Me.EsUnOperadorValido(_ServerUsr, claveAccesoBD)

        'retorno
        Return bRdo
    End Function

    'Login con credenciales de usuario
    Private Overloads Function Login(ByVal usuario As String, ByVal clave As String) As Boolean
        'Usuario a loguear
        _ServerUsr = usuario

        'Logueo al Fwrk
        Dim bRdo As Boolean
        bRdo = Me.EsUnOperadorValido(usuario, clave)

        'retorno
        Return bRdo
    End Function

    'Verifica el logueo del operador
    Private Function EsUnOperadorValido(ByVal nombreOperador As String, ByVal claveAcceso As String) As Boolean

        'Verifica si existe el operador dentro del sistema
        Dim sca As New StartFrame.BR.Sca

        Try
            Dim a As String
            a = SF.Strings.StringToSql("error")

            If sca.ExisteOperador(nombreOperador) Then
                'Registra la terminal si no existe
                sca.SetPrefTerm(Terminal, nombreOperador, 1, "", 0, 0, 0)

                'Verifica si es un usuario válido
                If sca.Login(nombreOperador, claveAcceso) Then
                    'Verifica si debe cambiar su clave de acceso
                    If sca.RequiereCambioClave(nombreOperador) Then
                        Throw New Exception("ERROR: El operador deberá cambiar su clave de acceso.")
                    End If
                    'Propiedades de la Common
                    Operador = nombreOperador
                    Password = claveAcceso
                    'Fin ok
                    Return True
                End If
            End If

            'Fin mal
            Return False

        Catch ex As Exception
            Throw ex

        Finally
            sca = Nothing
        End Try

    End Function

#End Region

End Class